计算物理中的根本性摩擦源于计算机使用 二进制浮点数运算来表示实数。与人类的十进制(十进制)思维不同,硬件以二进制(基底为2)存储数值。这导致了 泄漏的抽象:像 0.1 这样的简单小数无法被精确表示。
1. 浮点数的真实情况
Go 提供了两种主要的实数类型: float32 和 float64。当使用如 price := 0.0这样的短变量声明语法时,Go 默认使用 float64。这些类型是现实的近似值,而非精确的数学值。
2. 0.1 的奥秘
在十进制中,$1/3$ 会产生一个无限循环小数($0.333...$)。而在二进制中,0.1 的值会变成一个 无限循环分数。由于计算机内存是有限的,这个分数会被截断,从而引发累积误差。例如,$0.1 + 0.2$ 得到的结果是 $0.30000000000000004$,而不是精确的 $0.3$。
警告: 永远不要使用 == 在逻辑判断中比较浮点数,因为这些微小的差异会导致比较失败。
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>